# document_filler.py
from docx import Document
from template_processor import PROMPT_REGEX # 从 template_processor 导入正则表达式

def fill_document_with_content(doc, generated_content_map):
    """将AI生成的内容填充回Document对象。

    Args:
        doc (Document): 从模板加载的Document对象。
        generated_content_map (dict): 一个字典，键是原始提示词，值是AI生成的文本。
                                      例如: {"请描述项目的背景信息": "AI生成的背景信息..."}

    Returns:
        Document: 填充内容后的Document对象。
    """
    if not doc or not generated_content_map:
        return doc

    for para in doc.paragraphs:
        original_text = para.text
        # 使用 finditer 保留非匹配部分，并进行替换
        new_runs_data = [] # 用于存储新run的文本和样式信息
        last_end = 0

        for match in PROMPT_REGEX.finditer(original_text):
            prompt_key = match.group(1).strip() # 提取 {{提示:XXX}} 中的 XXX
            # 添加匹配前的文本
            if match.start() > last_end:
                new_runs_data.append({'text': original_text[last_end:match.start()], 'bold': False}) # 假设非提示词部分非粗体

            # 添加替换后的AI生成内容
            if prompt_key in generated_content_map:
                # 为了演示，这里简单替换，实际应用中可能需要保留提示词原有格式或应用特定格式
                ai_text = generated_content_map[prompt_key]
                new_runs_data.append({'text': ai_text, 'bold': True}) # 假设AI生成内容加粗显示
            else:
                # 如果某个提示词没有生成内容，则保留原提示词
                new_runs_data.append({'text': match.group(0), 'bold': False})

            last_end = match.end()

        # 添加最后一个匹配后的文本
        if last_end < len(original_text):
            new_runs_data.append({'text': original_text[last_end:], 'bold': False})

        # 如果发生了替换，则清空原段落的runs，并添加新的runs
        if new_runs_data and any(item['text'] != original_text for item in new_runs_data if len(new_runs_data) == 1 and item['text'] == original_text) == False : # 确保确实有变化
            # 检查是否有实际的文本变化，避免不必要的清空和重建
            is_changed = False
            if len(new_runs_data) != 1 or new_runs_data[0]['text'] != original_text:
                is_changed = True

            if is_changed:
                # 清空段落内原有的runs
                p_runs = para.runs
                for r in list(p_runs): # 需要转换为list来迭代，因为我们会修改它
                    p_runs.remove(r)

                # 添加新的runs
                for run_data in new_runs_data:
                    run = para.add_run(run_data['text'])
                    if run_data.get('bold'):
                        run.bold = True
                    # 可以根据需要添加更多格式，如字体、颜色等

    # 也可以考虑处理表格中的提示词，MVP阶段先专注段落
    # for table in doc.tables:
    #     for row in table.rows:
    #         for cell in row.cells:
    #             for para_in_cell in cell.paragraphs:
    #                 # ... 类似的替换逻辑 ...
    return doc

if __name__ == '__main__':
    # 测试代码
    from template_processor import load_template
    from ai_content_generator import AIContentGenerator

    # 1. 创建一个临时的docx用于测试
    test_doc = Document()
    test_doc.add_paragraph("项目背景：{{提示:项目背景与意义}}，非常重要。")
    test_doc.add_paragraph("解决方案：{{提示:技术方案详情}} 和 {{提示:风险评估}}。")
    test_doc.add_paragraph("这是一个没有提示的段落。")
    temp_fill_test_path = "d:\\code\\auto_pb\\auto_pb_app\\temp_fill_test_template.docx"
    test_doc.save(temp_fill_test_path)
    print(f"测试填充模板已保存到: {temp_fill_test_path}")

    # 2. 加载模板
    loaded_doc_for_fill = load_template(temp_fill_test_path)

    # 3. 假设AI生成了以下内容
    mock_ai_outputs = {
        "项目背景与意义": "[AI生成] 这是一个划时代的项目，旨在解决全球气候变暖问题，具有重大的社会和经济效益。",
        "技术方案详情": "[AI生成] 我们将采用先进的太阳能收集技术和智能电网分配系统。",
        "风险评估": "[AI生成] 主要风险包括技术成熟度、市场接受度和政策不确定性。"
    }

    if loaded_doc_for_fill:
        # 4. 填充文档
        filled_document = fill_document_with_content(loaded_doc_for_fill, mock_ai_outputs)

        # 5. 保存填充后的文档
        output_path = "d:\\code\\auto_pb\\auto_pb_app\\filled_test_document.docx"
        filled_document.save(output_path)
        print(f"填充后的文档已保存到: {output_path}")

        # 验证填充内容 (手动打开文档查看，或进一步编写代码解析验证)
        print("请打开 filled_test_document.docx 查看填充效果。AI生成的内容应该已替换提示词并加粗。")

    # 清理临时文件 (可选)
    # import os
    # os.remove(temp_fill_test_path)